package demo1;

/**
 * Created with IntelliJ IEDA.
 * Description:
 * User:86186
 * Date:2022-05-19
 * Time:20:42
 */
class Animal{
    private String name;
    private int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void eat(){
        System.out.println("正在吃饭(Animal)");
    }
    @Override
    public String toString() {
        return "Animal{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
class Dog extends Animal{

    public Dog(String name, int age) {
        super(name, age);
    }
    public void eark(){
        System.out.println(getName()+"正在汪汪汪");
    }

    @Override
    public void eat() {
        System.out.println(getName()+"正在吃狗粮");
    }
}
class Bird extends Animal{
    public String wing;

    public Bird(String name, int age) {
        super(name, age);
    }
    public void fly(){
        System.out.println(getName()+"正在飞");
    }
    @Override
    public void eat(){
        System.out.println(getName()+"要吃鸟粮");//动态绑定：重写
    }
}

public class Test {
    public static void main(String[] args) {
        Animal animal= new Bird("鹦鹉",2);
        Bird bird = (Bird)animal;
        bird.fly();
        /*********************************************************/
        //error：不是所有的动物都是鸟
        /*Animal animal1=new Dog("狗子",1);
        Bird bird = (Bird)animal;
        bird.fly();*///


    }
    //----------------------类的调用者实现的------------------------//
   /* private static void func(Animal animal){
        animal.eat();//不论引用的对象
    }
    public static void main(String[] args) {
        //父类引用，引用了子类对象，通过父类的引用，调用这个重写的方法，此时发生了动态绑定！
        //此时 父类引用只有一个，我引用的对象不一样，但是通过调用同一个方法，我们发现此时表现的形式是不一样
        //把这个现象称为:多态
        func(new Bird("小鸟",1));
        func(new Dog("狗子",1));
    }
    *//*public static void main(String[] args) {
        Bird bird = new Bird("鹦鹉",2);
        Animal animal=bird;//向上转型，把子类的类给父类
        //animal.fly  error:fly是bird类的，在这里我们是用的animal类
        //animal.wing  error:不可以调用了，此时通过父类引用，只能调用自己特有的方法
        animal.eat();
    }*/
}

//运行结果:鹦鹉正在飞
